package com.fanghaoran.notes.websocket;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: win11
 * @Date: 2023/05/04/15:53
 * @Description:
 */
@ServerEndpoint("/chat")
public class ChatEndpoint {

    /**
     * 存储每一个客户端对象对应的对象
     */
    private static Map<String,ChatEndpoint> onlineUsers = new ConcurrentHashMap<>();

    /**
     * 声明session对象 通过该对象发消息给用户
     */
    private Session session;

    /**
     * 声明一个HttpSession对象 servlet中的session
     */
    private HttpSession httpSession;

    /**
     * 连接建立时被调用
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig config){
        this.session=session;
        System.out.println("连接已建立");
        //获取httpSession对象
        HttpSession httpSession=(HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        this.httpSession=httpSession;
        //从httpSession对象中获取用户名
        String username=(String)httpSession.getAttribute("user");
        //将当前对象存储到容器中
        onlineUsers.put(username,this);
    }

    /**
     * 接收到客户端发送的数据时被调用
     * @param session websocket session对象
     * @param message 消息
     */
    @OnMessage
    public void onMessage(Session session,String message){

    }

    @OnClose
    public void onClose(){

    }

    /**
     * 发成错误所调用的方法
     * @param session websocket session对象
     * @param error 错误信息
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("WebSocket发生错误");
        error.printStackTrace();
    }
}
